/*
 * main.c
 *
 *  Created on: 9 févr. 2013
 *      Author: David Charbonnier et Imad Wakidi
 */

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

/*
 * Codage des cartes:
 * Couleur: p pour pique, q pour coeur, k pour carreau et t pour trÃ¨fle
 * Valeur numérique: 2 Ã  9 pour les cartes de mÃªme valeur
 * Valeurs des tÃªtes: A pour un 10, B pour un valet, C pour une dame, D pour un roi et E pour un as
 */
char* cartes[52] = { "2p", "3p", "4p", "5p", "6p", "7p", "8p", "9p", "Ap", "Bp",
		"Cp", "Dp", "Ep", "2q", "3q", "4q", "5q", "6q", "7q", "8q", "9q", "Aq",
		"Bq", "Cq", "Dq", "Eq", "2k", "3k", "4k", "5k", "6k", "7k", "8k", "9k",
		"Ak", "Bk", "Ck", "Dk", "Ek", "2t", "3t", "4t", "5t", "6t", "7t", "8t",
		"9t", "At", "Bt", "Ct", "Dt", "Et" };

/*
 * Trie une main dans l'ordre de valeurs des cartes
 *
 * @param char* main : chaine de caractèe définissant une main
 * @return char* : la main triée
 */
char* triMain(char* main) {
	int permutation = 1;
	char valTemp;
	char coulTemp;
	while (permutation == 1) {
		permutation = 0;
		for (int i = 0; i < 8; i += 2) {
			if ((int) main[i] > (int) main[i + 2]) {
				valTemp = main[i];
				coulTemp = main[i + 1];
				main[i] = main[i + 2];
				main[i + 1] = main[i + 3];
				main[i + 2] = valTemp;
				main[i + 3] = coulTemp;
				permutation = 1;
			}
		}
	}
	return main;
}

/*
 * Fonction qui génèe la liste des mains possibles au poker
 *
 * @param char** : tableau alloué en mémoire contenant la liste des mains
 * @return int : 0 si tout s'est bien passé, -1 en cas d'erreur
 */
int genererMains(FILE* fichier) {
	char* main;
	for (int i = 0; i < 52; i++) {
		for (int j = i + 1; j < 52; j++) {
			for (int k = j + 1; k < 52; k++) {
				for (int l = k + 1; l < 52; l++) {
					for (int m = l + 1; m < 52; m++) {
						main = malloc(11 * sizeof(char));
						main[0] = '\0';
						if (sprintf(main, "%s%s%s%s%s", cartes[i], cartes[j],
								cartes[k], cartes[l], cartes[m]) < 0) {
							return -1;
						}
//						printf("%s", triMain(main));
						fputs(triMain(main), fichier);
					}
				}
			}
		}
	}
	return 0;
}

int main(int argc, char** argv) {
	FILE* fichier = NULL;
	// Modifiez cette ligne afin d'écrire le fichier contenant les mains au bon endroit
	fichier = fopen("/home/david/workspace/Poker/Debug/mains", "w");
	if (fichier != NULL ) {
		genererMains(fichier);
		fclose(fichier);
	} else {
		return -1;
	}
	return 0;
}
